在這個實驗裡我們用的原始資料集在這裡下載
或是直接從這裡下載 csv 跟 notebook 就好
這個資料集名稱叫做 GTZAN ,裏頭一共有 10 種類型的音樂,每種類型有 100 首歌曲,每首歌曲都是 30 秒鐘
這 10 種音樂類型為:
0: "disco",
1: "metal",
2: "reggae",
3: "blues",
4: "rock",
5: "classical",
6: "jazz",
7: "hiphop",
8: "country",
9: "pop"
除此之外,他很好心的幫我們把 features 萃取出來了,你還會額外有兩個 csv 檔,分別是 features_3_sec 跟 features_30_sec
features_3_sec 把一首 30 秒的歌切成 10 個音框,每個音框 3 秒,然後計算每 3 秒的 features,所以他的features 數是原本的 10 倍
我們就用它提供給的 csv 檔來做即可
import pandas as pd
import numpy as np
from sklearn.preprocessing import LabelEncoder
data = pd.read_csv("features_3_sec.csv")
data.head()
# (9990,60)
data.shape
# 移除有檔名的那欄
data = data.drop(labels='filename',axis=1)
# 最後一欄是類別 (str)
class_list = data.iloc[:,-1]
# 用 LabelEncoder 幫我們把類別編碼
convert = LabelEncoder()
y = convert.fit_transform(class_list)
y
x = data.iloc[:,:-1]
x
接著我們要把餵進去的 feature data 常態分布化,這樣平均值會變成 0, 標準差變為 1,使離群值影響降低
from sklearn.preprocessing import StandardScaler
fit = StandardScaler()
X = fit.fit_transform(np.array(x,dtype=float))
再切分成 train, valid 兩份 data
from sklearn.model_selection import train_test_split
X_train,x_test, Y_train, y_test = train_test_split(X,y,test_size=0.2)
print(len(Y_train),len(y_test))
開始 build 我們的模型吧,單純用 FCN 就好了
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
model = Sequential(
[
Dense(512,input_shape=(X_train.shape[1],),activation='relu'),
Dense(256,activation='relu'),
Dense(128,activation='relu'),
Dense(64,activation='relu'),
Dense(10,activation='softmax')
]
)
model.summary()
model.compile(loss='sparse_categorical_crossentropy',optimizer='adam',metrics='accuracy')
開 Train
history = model.fit(
X_train,
Y_train,
validation_data=(x_test,y_test),
epochs=600,
batch_size=128
)
到這裡差不多 test data 就有 9 成的準確率了,我們來看一下 loss 長怎樣
from matplotlib import pyplot
pyplot.plot(history.history['loss'], label='train')
pyplot.plot(history.history['val_loss'], label='test')
pyplot.legend()
pyplot.show()
其實你會發現比較惱人的部分是在萃取資料的 feature,以這個資料集來說一段音樂用了 60 個 feature,如果想要試在其他音樂上的話就必須生出那 60 個 feature。當然也可以試著用比較少的 feature 來做,但效果在這個 model 上就會開始變差,或是要訓練的更久才能一樣好。總而言之,我們確實證明了聲音的 feature 是可以讓機器來區別音樂種類的。